Deno Fresh
https://fresh.deno.dev/
Freshハンズオン 初級編
Freshハンズオン 中級編
Deno で掲示板サイトを作ろう! with upstash & supabase その 3 (投稿の登録 - バリデーションとサニタイズ) - 虎の穴開発室ブログ
Deno FreshでHonoのRPCモードを使う 🍋+🔥 #JavaScript - Qiita
DenoでうごくフルスタックのWebフレームワーク
UIライブラリ:Preact
スタイリングフレームワーク:tailwindcss or Twind
現在はtailwindcssを推奨
個人的な使い道:Deno Deployへホスティングしたい場合につかう
DenoFreshでおさえておきたいコンセプト
ファイルベースルーティング
1ページはhandlersとpage componentで構成される
アイランドアーキテクチャ
Web標準
.envから環境変数を読み込める
ファイルベースルーティングを採用
routes/にファイルを置く
routes/index.ts -> /
routes/blog/contact.ts -> /blog/contact
詳しくは Routing | Fresh docs
実際にはhandlersとpage componentの2つから構成されている
handlers:バックエンドAPIのようなもの
共通のレイアウト
例えばナビゲーションバーとか
_layout.tsxで表現する。Layouts | Fresh docs
layoutにカスタムハンドラで取得した値を入れるには?
ミドルウェア
_middleware.ts
アイランドアーキテクチャ
1枚のWebページを海と島にたとえる。
海:静的なWebページ
島:動的なWebページ
すべてのページはサーバサイドでレンダリングされる
島の箇所だけJSを用意(ハイドレート)し高速化できる
島のコンポーネントはislands/に配置する
クライアントサイドで実行される処理はislands/に置く
/islands/フォルダから何かをインクルードしない限り、JavaScriptはクライアントに送信されません。
onClickハンドラをislands外で使用できない
海と島を厳密に分けすぎないほうが良さそう。いろいろと使い勝手が悪い
ただハイドレーション前にどのような表示であって欲しいかは意識する必要がある
フォーム
Forms | Fresh docs
使い方は同じで、送信したデータをカスタムハンドラーでキャッチして処理する
ウェブフォームの構成要素 - ウェブ開発を学ぶ | MDN
<form>: フォーム要素 - HTML: ハイパーテキストマークアップ言語 | MDN
初めてのフォーム - ウェブ開発を学ぶ | MDN
フォームデータの送信 - ウェブ開発を学ぶ | MDN
フォームだと辛いところ
1ページに複数フォームがある
ページのカスタムハンドラは使えない?
API用のカスタムハンドラを複数個用意になりそう
配列やオブジェクトを送りたいとき、バックエンド側で何とか解釈させる必要がある
FormをPOSTした後の遷移先
同じときどうしたらいい?
リダイレクト or ふつうにページ遷移
useSignalの使い方
valueプロパティで参照を忘れないこと
https://fresh-with-signals.deno.dev/
https://github.com/lucacasonato/fresh-with-signals/blob/main/routes/index.tsx
モジュールとしてSignalの値を持つことでSignalを共有できる
https://gyazo.com/ca31fb6f342be37f92b5f9001740546e
cartを異なるislandからimportして共有できる。書き込むとcartの値が書き換わる
シグナルの値が変化したとしても、コンポーネント全体が再レンダリングされるわけではない?
↑なんでそう思ったのか不明
使っているコンポーネントではレンダリングされてそう
IS_BROWSER
https://gyazo.com/c2bb6de28d3833069d41eb9a5c8c399b
ハイドレーション前:「わいわい」が表示
ハイドレーション後:カウントのボタンが表示
https://gyazo.com/562462dbf250ecb0c94d5d0635dcd9db
カスタムハンドラ
リダイレクト
1つのページンコンポーネントに複数のPOSTカスタムハンドラを用意したい場合どうしたらいいか
振る舞い込みのUIライブラリを使えないのが難点かも
使えないことはないが一工夫必要
本番環境へデプロイする際は事前にビルドが必要
ビルドしないとTailwindのスタイリングが効かない
1. ビルド
$ deno run -A dev.ts build
2. アプリ起動
$ deno run -A main.ts
エラーページへの遷移
https://fresh.deno.dev/docs/concepts/error-pages
エラーページは_layout.tsx含めたうえでレンダリングされる
404エラー
routes/_404.tsxを作っておくとレンダリングされる
ページ遷移方法
エラーページにデータを渡したいとき:return ctx.renderNotFound();
データ渡さなくてよいとき:throw new Deno.errors.NotFound();
https://gyazo.com/fc128583515bd1e6e357f943ee4b6003
500エラー
routes/_500.tsxを作っておくとレンダリングされる
ページ遷移方法:例外を投げる。throw new Error("waiwai");
code:_500.tsx
export default function Error500Page({ error }: PageProps) {
return <p>500 internal error: {(error as Error).message}</p>;
}
https://gyazo.com/b2c3b459afe9bbf2fbd9a6f9baa1f808
エラーメッセージの表示
API叩いてバリデーションエラーであればページ内にレンダリングしたい
public.icon